//利用者登録内容をチェックするクラス

package member;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import common.DBManager;

public class EntryServlet extends HttpServlet {

	Statement smt  = null;
	Connection con = null;

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

//　入力パラメータの文字エンコーディング
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();



//　入力パラメータの取得
		String user_id 		= request.getParameter("user_id");
		String user_name	= request.getParameter("user_name");
		String user_ruby	= request.getParameter("user_ruby");
		String password		= request.getParameter("password");


//　エラー発生枠の
		String id_redline 	= null;
		String name_redline = null;
		String ruby_redline = null;
		String pass_redline = null;

//　エラー内容の文章
		String blank_error	= null;
		String id_error 	= null;
		String ruby_error 	= null;
		String pass_error 	= null;

//　空欄チェックのフラグ
		boolean blank 		= false;


		String path 		= "/member/userMemberEntryCheck.jsp";

//　利用者ＩＤのチェック
		if(user_id==null||user_id.length()==0){
			blank 			= true;
			id_redline 		= "red_frame";
		}else if(!UserIdcheck(user_id)){
			//　利用者ＩＤの重複チェック
			path 			= "/member//userMemberEntry.jsp";
			id_error		="そのIDはすでに利用されています";
			id_redline 		= "red_frame";
		}//利用者ＩＤの文字数チェック
		else if (user_id.length() > 100){
			id_error		="IDが制限文字数を超えています";
			path 			= "/member//userMemberEntry.jsp";
			id_redline 		= "red_frame";
		}
//=======利用者ＩＤの半角英数字チェック処理追加【20131017_yano】
		//利用者ＩＤの半角英数字チェック
		else if (!Mailcheck(user_id)){
			id_error		="メールアドレスは、半角で入力して下さい";
			path 			= "/member//userMemberEntry.jsp";
			id_redline 		= "red_frame";
		}

//　利用者名のチェック
		if(user_name==null||user_name.length()==0){
			blank 			= true;
			name_redline 	= "red_frame";
		}

//　利用者フリガナのチェック
		if(user_ruby==null||user_ruby.length()==0){
			blank		 	= true;
			ruby_redline 	= "red_frame";
		}else if (!user_ruby.matches("^[ァ-ヶー]*$")) {
			//　振り仮名の整合性チェック
		    // 半角数値のみで構成された文字列ではない
			path 			= "/member//userMemberEntry.jsp";
			ruby_error 		= "フリガナは全角カタカナにしてください";
			ruby_redline 	= "red_frame";
		}

//　パスワードのチェック
		if(password==null||password.length()==0){
			blank 			= true;
			pass_redline 	= "red_frame";
		}else if(!Passcheck(password)){
			//　パスワードの整合性チェック
			path 			= "/member//userMemberEntry.jsp";
			pass_error 		= "パスワードは、6桁以上10桁以下の半角英数字にしてください";
			pass_redline 	= "red_frame";
		}

//　空欄のチェックがあった場合
		if(blank){
			blank_error 	= "すべての項目を入力してください";
			path 			= "/member/userMemberEntry.jsp";
		}


//　リクエストスコープに"引数1"という名前で引数2の文字列を登録


     	request.setAttribute( "id_redline" , id_redline );
     	request.setAttribute( "name_redline" , name_redline );
     	request.setAttribute( "ruby_redline" , ruby_redline );
     	request.setAttribute( "pass_redline" , pass_redline );

     	request.setAttribute( "blank_error" , blank_error );
     	request.setAttribute( "id_error" , id_error );
     	request.setAttribute( "ruby_error" , ruby_error );
     	request.setAttribute( "pass_error" , pass_error );

		RequestDispatcher dispatcher = request.getRequestDispatcher(path);



//　フォワードの実行　エラーがあれば利用者登録画面へ、なければ利用者登録確認画面へ遷移
		dispatcher.forward(request, response);
		}

//　パスワードの整合性の識別　　パスワードは半角英数字のみなのでそれ以外の時はNG
private boolean Passcheck(String pass){

	boolean check = true;

	 char[] chars = pass.toCharArray();
	 	if(chars.length < 6 || chars.length > 10){
	 		check = false;
	 		}else{
	    for (int i = 0; i < chars.length; i++) {
	         char c = chars[i];
	         if ((c <= '\u007e') || // 英数字
	        	                (c == '\u00a5') || // \記号
	        	                (c == '\u203e') || // ~記号
	        	               (c >= '\uff61' && c <= '\uff9f') // 半角カナ
	 	        ) {  } else {
	        	             check = false;
	        	             break ;
	         }
	     }
	 	}
	return check;
	}

//メールアドレスの半角英数字入力チェック処理追加【20131017_yano】
//メールアドレスは半角英数字のみなのでそれ以外の時はNG
	private boolean Mailcheck(String user_id){

		boolean check = true;

		 char[] chars = user_id.toCharArray();
	    for (int i = 0; i < chars.length; i++) {
	         char c = chars[i];
	         if ((c <= '\u007e') || // 英数字
	        	                (c == '\u00a5') || // \記号
	        	                (c == '\u203e') || // ~記号
	        	               (c >= '\uff61' && c <= '\uff9f') // 半角カナ
	 	        ) {  } else {
	        	             check = false;
	        	             break ;
	         }
		}
		return check;
	}

//　利用者IDの重複チェック
private boolean UserIdcheck(String user_id){
	boolean check = true;

	//　入力された利用者IDと同じIDのものを検索する
	String sql = "select count(*) as cnt from members where USER_ID = '"+user_id + "'";

	try {

	con = DBManager.getConnection();
	smt  = con.createStatement();

	ResultSet rs   = smt.executeQuery(sql);

	if(rs.next()){
		int coung = rs.getInt("cnt");
		if(coung > 0)
		check = false;
	}

	}catch (SQLException e){

	}finally{
		if(smt != null){try{smt.close();}catch(SQLException ignore){}}
		if(con != null){try{con.close();}catch(SQLException ignore){}}
	}

	return check;
  }
}
